//package com.douqu.game.battle.controller;
//
//import com.douqu.game.battle.entity.BattleMasterAObject;
//import com.douqu.game.battle.entity.BattleSoldierAObject;
//import com.douqu.game.battle.entity.PlayerBattleTmp;
//import com.douqu.game.battle.entity.SpritePlayerBattleTmp;
//import com.douqu.game.battle.server.GameServer;
//import com.douqu.game.core.e.E_BattleAObjectStatus;
//import com.douqu.game.core.entity.battle.BattleAObject;
//import com.douqu.game.core.entity.battle.BattleGrid;
//import com.douqu.game.core.entity.battle.SpriteBattleTmp;
//import com.douqu.game.core.entity.common.CommonData;
//import com.douqu.game.core.entity.InitData;
//import com.douqu.game.core.controller.BattleParentController;
//import com.douqu.game.core.controller.PlayerController;
//import com.douqu.game.core.controller.SpriteController;
//import com.douqu.game.core.entity.sprite.Card;
//import com.douqu.game.core.entity.sprite.Soldier;
//import com.douqu.game.core.factory.DataFactory;
//import com.douqu.game.core.i.IMainServer;
//import com.douqu.game.core.protobuf.SGCommonProto.*;
//import com.douqu.game.core.protobuf.SGMainProto;
//import com.douqu.game.core.protobuf.SGWarProto;
//import com.google.protobuf.InvalidProtocolBufferException;
//import org.apache.log4j.Logger;
//
//import java.util.ArrayList;
//import java.util.Collections;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.CopyOnWriteArrayList;
//
//
///**
// * Created by bean on 2017/7/18.
// */
//public class BackupBattleController extends BattleParentController {
//
//    private Logger logger = Logger.getLogger(this.getClass());
//
//    /**
//     * 兵种ID生成
//     */
//    protected int soldierId;
//
//    /**
//     * 场上的所有兵
//     */
//    protected List<BattleAObject> soldiers;
//
//    protected Map<Integer, BattleAObject> soldierMap;
//
//
//    public BackupBattleController(String battleId, PlayerController player, SpriteController target, E_BATTLE_TYPE battleType)
//    {
//        super(battleId, player, target, battleType);
//    }
//
//    @Override
//    public void init()
//    {
//        super.init();
//
//        InitData initData = DataFactory.getInstance().getInitData();
//        if(initData != null)
//        {
//            this.curCrystal = initData.curCrystal;
//            this.maxCrystal = initData.maxCrystal;
//            this.crystalGrows = initData.crystalGrow;
//            this.maxBattleTime = crystalGrows[crystalGrows.length-1].id;
//        }
//
//        this.createTime = System.currentTimeMillis();
//
//        grids = new BattleGrid[MAX_ROW][MAX_COL];
//
//        //队伍1的主将
//        BattleMasterAObject masterAObject = new BattleMasterAObject(E_BattleAObjectStatus.FREE);
//        masterAObject.setId(getSoldierId());
//        masterAObject.setTeamNo(BattleController.TEAM_1);
//
//        BattleGrid grid = null;
//        for(int i = 0; i < TEAM_1_MASTER.length; i++)
//        {
//            grid = new BattleGrid();
//            grid.battleAObject = masterAObject;
//            masterAObject.addGrid(grid);
//            grids[TEAM_1_MASTER[i][0]][TEAM_1_MASTER[i][1]] = grid;
//        }
//
//        SpritePlayerBattleTmp pbt = new SpritePlayerBattleTmp();
//        pbt.setBattleParent(this);
//        pbt.init(player, masterAObject, BattleController.TEAM_1);
//        player.setAttachment(pbt);
//        player.setParent(this);
//
//        playerList.add(player);
//
//        soldiers = new CopyOnWriteArrayList<>();
//        soldiers.add(masterAObject);
//
//        soldierMap = new ConcurrentHashMap<>();
//        soldierMap.put(masterAObject.getId(), masterAObject);
//    }
//
//
//    public int getSoldierId()
//    {
//        return ++soldierId;
//    }
//
//
//    /**
//     *
//     * @param currentTime 当前时间
//     */
//    public void update(long currentTime)
//    {
//        if(startTime <= 0)
//            return;
//
//        battleTime += 500;
//
//        if(curCrystal < maxCrystal)
//        {
//            if(crystalGrows != null && crystalGrows.length > 0)
//            {
//                for(CommonData data : crystalGrows)
//                {
//                    if(battleTime < data.id)
//                    {
//                        //在此区间的成长规则
//                        if(battleTime % data.value == 0)
//                            curCrystal++;
//                        break;
//                    }
//                }
//            }
//        }
//
//
//        if(currentTime - startTime >= maxBattleTime)//战斗时间到了
//        {
//            //战斗时间到了,检测胜负
//            int winTeam = getWinTeam();
//            if(winTeam != 0)
//            {
//                //通知对方谁赢了
//            }
//            else
//            {
//                //平局
//            }
//        }
//        else//时间没到
//        {
//            //检测兵的攻击范围内有没有敌人
//            int range = -1;
//            for(BattleGrid[] gridAry : grids)
//            {
//                for(BattleGrid grid : gridAry)
//                {
//                    if(grid.battleAObject == null)
//                        continue;
//
//                    if(grid.battleAObject.isDie())
//                    {
//                        grid.battleAObject = null;
//                        continue;
//                    }
//
//                    range = grid.getAtkRange();
//                    if(range < 0)
//                        continue;
//
//                    if(range == 0)
//                    {
//                        //全屏攻击
//                    }
//                    else
//                    {
//                        for(int i = 1; i < range+1; i++)
//                        {
//                            if(checkGrid(grid.x,grid.y+i) && grid.isAtkTarget(grids[grid.x][grid.y+i], false))
//                            {
//                                //是攻击目标
//                                soldierBattle(grid, grids[grid.x][grid.y+i]);
//                            }
//                            else if(checkGrid(grid.x+i,grid.y) && grid.isAtkTarget(grids[grid.x+i][grid.y], false))
//                            {
//                                //是攻击目标
//                                soldierBattle(grid, grids[grid.x+i][grid.y]);
//                            }
//                            else if(checkGrid(grid.x-i,grid.y) && grid.isAtkTarget(grids[grid.x-i][grid.y], false))
//                            {
//                                //是攻击目标
//                                soldierBattle(grid, grids[grid.x-i][grid.y]);
//                            }
//                            else if(checkGrid(grid.x,grid.y-i) && grid.isAtkTarget(grids[grid.x][grid.y-i], false))
//                            {
//                                //是攻击目标
//                                soldierBattle(grid, grids[grid.x][grid.y-i]);
//                            }
//                        }
//                    }
//                }
//            }
//        }
//    }
//
//
//
//    private boolean checkGrid(int x, int y)
//    {
//        if(x < 0 || y < 0 || x >= BattleController.MAX_ROW || y >= BattleController.MAX_COL)
//            return false;
//
//        return true;
//    }
//
//
//    public void start()
//    {
//        startTime = System.currentTimeMillis();
//        battleTime = 0;
//
//        IMainServer server = GameServer.getInstance().getiMainServer();
//        if(server != null)
//        {
//            server.battleStart(this);
//        }
//    }
//
//    public void end(int winTeam)
//    {
//        //通知双方战斗结束，计算战斗奖励
//
//    }
//
//
//
//    public int getWinTeam()
//    {
//        return 0;
//    }
//
//
//    /**
//     * 上战场
//     * @param playerController
//     * @param data
//     */
//    public void toBattlefield(PlayerController playerController, byte[] data) throws InvalidProtocolBufferException {
//        //玩家选择的要放的格子坐标
//        SGWarProto.C2S_ToBattle request = SGWarProto.C2S_ToBattle.parseFrom(data);
//        List<Grid> targetList = request.getSoldierGridList();
//        for(Grid grid : targetList)
//        {
//            if(grid.getX() < 0 || grid.getY() >= MAX_ROW || grid.getX() < 0 || grid.getY() >= MAX_COL)
//            {
//                //参数错误
//                return;
//            }
//        }
//
//        if(isEnd())
//            return;
//
//        SpritePlayerBattleTmp playerBattleTmp = (SpritePlayerBattleTmp) playerController.getAttachment();
//        if(playerBattleTmp == null)
//        {
//            //错误
//            return;
//        }
//        int index = request.getCardIndex();//要上场的卡牌索引
//        Card card = playerBattleTmp.getBattleCard(index);
//        if(card == null)
//        {
//            //没有此卡牌
//            return;
//        }
//        if(curCrystal < card.crystal)
//        {
//            //水晶不够
//            return;
//        }
//
//        //兵种上场
//        Soldier soldier = DataFactory.getInstance().getGameObject(DataFactory.SOLDIER_KEY, card.soldierId);
//        if(soldier == null)
//            return;
//
//        BattleSoldierAObject battleSoldierAObject = new BattleSoldierAObject();
//        battleSoldierAObject.setId(getSoldierId());
//        battleSoldierAObject.setSoldier(soldier);
//        battleSoldierAObject.setHp(soldier.hp);
//        battleSoldierAObject.setTeamNo(playerBattleTmp.getTeamNo());
//        soldiers.add(battleSoldierAObject);
//        soldierMap.put(battleSoldierAObject.getId(), battleSoldierAObject);
//
//        BattleGrid newGrid = null;
//        List<BattleGrid> list = new ArrayList<>();
//        for(Grid grid : request.getSoldierGridList())
//        {
//            if(grids[grid.getX()][grid.getY()].isNotFree())
//            {
//                //客户端发来的参数不同步，暂时不修正
//                logger.info("客户端发来的参数不同步，暂时不修正:x:" + grid.getX()+ " y:" + grid.getY());
//            }
//            newGrid = new BattleGrid();
//            newGrid.setX(grid.getX());
//            newGrid.setY(grid.getY());
//            newGrid.battleAObject = battleSoldierAObject;
//            grids[grid.getX()][grid.getY()] = newGrid;
//
//            list.add(newGrid);
//        }
//        battleSoldierAObject.setGrids(list);
//
//        //消耗水晶
//        curCrystal -= card.crystal;
//
//        //TODO 计算路线
//
//        //TODO 转发消息
//    }
//
//
//
//
//    /**
//     * 场上的兵开始战斗
//     * @param source
//     * @param target
//     */
//    private void soldierBattle(BattleGrid source, BattleGrid target)
//    {
//        if(source.battleAObject == null || target.battleAObject == null)
//            return;
//
//        if(source.battleAObject.isDie() || target.battleAObject.isDie())
//            return;
//
//        source.battleAObject.addAtkTarget(target.battleAObject);
//        //TODO 告诉对方士兵进入战斗
//
//        SGWarProto.S2C_ToBattle.Builder response = SGWarProto.S2C_ToBattle.newBuilder();
//
//        dispatchMsg(SGMainProto.E_MSG_ID.MsgID_War_ToBattle_VALUE, response.build().toByteArray());
//    }
//
//
//    /**
//     * 场上的兵被kill
//     */
//    public void killSoldier(PlayerController playerController, byte[] data)
//    {
//        int soldierId = 0;//获取参数,(兵种ID)
//        BattleAObject battleAObject = soldierMap.get(soldierId);
//        if(battleAObject == null)
//        {
//            //没有这个兵
//            return;
//        }
//
//        PlayerBattleTmp playerBattleTmp = (PlayerBattleTmp) playerController.getAttachment();
//        if(playerBattleTmp.getTeamNo() == battleAObject.getTeamNo())
//        {
//            //目前设定，不能自己杀死自己的兵
//            return;
//        }
//
//        battleAObject.setHp(0);
//        soldiers.remove(battleAObject);
//        soldierMap.remove(soldierId);
//
//        if(battleAObject instanceof BattleMasterAObject)
//        {
//            //主将死了，战斗结束
//            //胜利队伍
//            end(playerBattleTmp.getTeamNo());
//        }
//        else
//        {
//            //普通的兵死亡
//        }
//    }
//
//
//
//    private void synPos(PlayerController playerController, byte[] data)
//    {
//        List<Pos> routes = null;//客户端传过来的路线
//
//        List<Pos> posList = new CopyOnWriteArrayList<>();
//        Collections.copy(posList, routes);
//
//        int id = 0;//上场兵的id
//        PlayerBattleTmp playerBattleTmp = (PlayerBattleTmp) playerController.getAttachment();
//        BattleSoldierAObject soldier = (BattleSoldierAObject) soldierMap.get(id);
//        if(soldier == null)
//        {
//            //没这个兵了
//            return;
//        }
//
//        soldier.setRouteList(posList);
//    }
//
//
//
//
//    /** 消息通道
//     */
//    public void messageChannel(int code, PlayerController playerController, byte[] data)
//    {
//        SpriteBattleTmp battleTmp = playerController.getAttachment();
//        if(battleTmp == null)
//            return;
//
//        if(battleTmp.getTeamNo() == BattleController.TEAM_SPECTATOR)
//        {
//            //观战者
//            return;
//        }
//
//
//        try{
//            switch (code)
//            {
//                case SGMainProto.E_MSG_ID.MsgID_War_ToBattle_VALUE://两个兵开战
//                    toBattlefield(playerController, data);
//                    break;
//                case SGMainProto.E_MSG_ID.MsgID_War_SynPos_VALUE://同步位置
//                    synPos(playerController, data);
//                    break;
//            }
//        }catch (Exception e){
//            logger.info("Error: code:" + code +" " + e.getLocalizedMessage());
//        }
//
//    }
//
//
//}
